package com.song.proxy;


import org.springframework.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * @Description: CglibProxyUtil：类描述
 * @author: songzhangyong
 * @Date: 2019/11/1 17:22
 */
public class CglibProxyUtil {

	public static void main(String[] args) {

		//1创建目标对象
		final UserServiceImpl userServiceImpl = new UserServiceImpl();
		//2创建代理对象
		//2.1创建增强器对象
		Enhancer enhancer = new Enhancer();
		//2.2设置增强器的类加载器
		enhancer.setClassLoader(userServiceImpl.getClass().getClassLoader());
		//2.3设置代理对象父类类型
		enhancer.setSuperclass(userServiceImpl.getClass());
		//2.4设置回调函数
		enhancer.setCallback(new MyInvocationHandler());

		IUserService ss = (IUserService) enhancer.create();
//		ss.query("fdfdfd");
		ss.save("fdfdfd", 1);
		System.out.println();

	}

	static class MyInvocationHandler implements MethodInterceptor {

		/**
		 * @param proxy  就是代理对象，newProxyInstance方法的返回对象
		 * @param method 调用的方法
		 * @param args   方法中的参数
		 * @return
		 * @throws Throwable
		 */

		@Override
		public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
			System.out.println("---------before---cglib----" + method.getName());
			methodProxy.invokeSuper(proxy, args);
			System.out.println("---------after----cglib---");
			if ("method".equals(method.getName())) {
				return method.invoke(proxy, null);
			}
			return null;
		}
	}

}
